package com.bbva.general.controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.event.ActionEvent;

import com.bbva.general.dao.PerfilusuarioDAOImpl;
import com.bbva.general.entities.AccesoperfilAccion;
import com.bbva.general.entities.Iconossistemas;
import com.bbva.general.entities.Datosgenerales;
import com.bbva.general.entities.Perfilusuario;
import com.bbva.general.entities.Accesoperfil;
import com.bbva.general.entities.UvListarOpcionPerfil;
import com.bbva.general.generics.Constantes;
import com.bbva.general.generics.ControllerSystem;
import com.bbva.general.generics.OpcionPerfilConverter;
import com.bbva.general.generics.AccionesPaginaConverter;
import com.bbva.general.generics.ServiceGeneric;
import com.bbva.general.controller.AccesoperfilController;
import com.bbva.general.controller.DatosgeneralesController;
import com.bbva.general.controller.AccesoperfilAccionController;
import com.bbva.general.controller.IconossistemasController;
import com.bbva.general.controller.UvListarOpcionPerfilController;

public class PerfilusuarioController extends PerfilusuarioDAOImpl {

	private List<UvListarOpcionPerfil> listaOpcionPerfil = new ArrayList<UvListarOpcionPerfil>();
	private List<Perfilusuario> listaPerfilusuario = getList(); 
		
	private List<Accesoperfil> listaAccesoperfil = new AccesoperfilController().getList();
	
	private Perfilusuario bean;
	private int indice;
	private int esNuevo = 1;
	private String tituloMant = "";	
	private String valABuscar = "";
	private List<Iconossistemas> listaOpciones = new ArrayList<Iconossistemas>();
	private List<Iconossistemas> listaOpcionesTmp = new ArrayList<Iconossistemas>();
	private List<Iconossistemas> listaOpcionesSelect = new ArrayList<Iconossistemas>();
	private List<Iconossistemas> listaGeneral = new ArrayList<Iconossistemas>();
	private List<Accesoperfil> listaAccesosPerfilDel = new ArrayList<Accesoperfil>();
	private OpcionPerfilConverter converter;
	private AccionesPaginaConverter converterAcciones;
	private String tituloAcceso = "";
	private String tituloAccion = "";
	
	ServiceGeneric gService = new ServiceGeneric();
	ControllerSystem controllerSystem = (ControllerSystem)gService.getSpringBean(Constantes.CONTROLLER_SYSTEM);
		
	private List<Datosgenerales> listaAcciones = new ArrayList<Datosgenerales>();
	private List<Datosgenerales> listaAccionesSelect = new ArrayList<Datosgenerales>();
	private List<Datosgenerales> listaGeneralAcciones = new ArrayList<Datosgenerales>();
	private List<Datosgenerales> listaAccionesTmp = new ArrayList<Datosgenerales>();
	
	private List<AccesoperfilAccion> listaAccionesPerfilDel = new ArrayList<AccesoperfilAccion>();
	private Accesoperfil beanAcceso;
	private AccesoperfilAccion beanAccesoAccion;
	
	public String getTituloAccion() {
		return tituloAccion;
	}

	public void setTituloAccion(String tituloAccion) {
		this.tituloAccion = tituloAccion;
	}

	public AccesoperfilAccion getBeanAccesoAccion() {
		return beanAccesoAccion;
	}

	public void setBeanAccesoAccion(AccesoperfilAccion beanAccesoAccion) {
		this.beanAccesoAccion = beanAccesoAccion;
	}

	public AccionesPaginaConverter getConverterAcciones() {
		return converterAcciones;
	}

	public void setConverterAcciones(AccionesPaginaConverter converterAcciones) {
		this.converterAcciones = converterAcciones;
	}
	
	public List<Datosgenerales> getListaAccionesTmp() {
		return listaAccionesTmp;
	}

	public void setListaAccionesTmp(List<Datosgenerales> listaAccionesTmp) {
		this.listaAccionesTmp = listaAccionesTmp;
	}

	public List<Iconossistemas> getListaOpcionesTmp() {
		return listaOpcionesTmp;
	}

	public void setListaOpcionesTmp(List<Iconossistemas> listaOpcionesTmp) {
		this.listaOpcionesTmp = listaOpcionesTmp;
	}

	public List<Accesoperfil> getListaAccesoperfil() {
		return listaAccesoperfil;
	}

	public void setListaAccesoperfil(List<Accesoperfil> listaAccesoperfil) {
		this.listaAccesoperfil = listaAccesoperfil;
	}

	public Accesoperfil getBeanAcceso() {
		return beanAcceso;
	}

	public void setBeanAcceso(Accesoperfil beanAcceso) {
		this.beanAcceso = beanAcceso;
	}

	public List<Datosgenerales> getListaAcciones() {
		return listaAcciones;
	}

	public void setListaAcciones(List<Datosgenerales> listaAcciones) {
		this.listaAcciones = listaAcciones;
	}

	public List<Datosgenerales> getListaAccionesSelect() {
		return listaAccionesSelect;
	}

	public void setListaAccionesSelect(List<Datosgenerales> listaAccionesSelect) {
		this.listaAccionesSelect = listaAccionesSelect;
	}

	public List<Datosgenerales> getListaGeneralAcciones() {
		return listaGeneralAcciones;
	}

	public void setListaGeneralAcciones(List<Datosgenerales> listaGeneralAcciones) {
		this.listaGeneralAcciones = listaGeneralAcciones;
	}

	public List<AccesoperfilAccion> getListaAccionesPerfilDel() {
		return listaAccionesPerfilDel;
	}

	public void setListaAccionesPerfilDel(
			List<AccesoperfilAccion> listaAccionesPerfilDel) {
		this.listaAccionesPerfilDel = listaAccionesPerfilDel;
	}

	public List<UvListarOpcionPerfil> getListaOpcionPerfil() {
		return listaOpcionPerfil;
	}

	public void setListaOpcionPerfil(List<UvListarOpcionPerfil> listaOpcionPerfil) {
		this.listaOpcionPerfil = listaOpcionPerfil;
	}

	public List<Accesoperfil> getListaAccesosPerfilDel() {
		return listaAccesosPerfilDel;
	}

	public void setListaAccesosPerfilDel(List<Accesoperfil> listaAccesosPerfilDel) {
		this.listaAccesosPerfilDel = listaAccesosPerfilDel;
	}

	public List<Iconossistemas> getListaGeneral() {
		return listaGeneral;
	}

	public void setListaGeneral(List<Iconossistemas> listaGeneral) {
		this.listaGeneral = listaGeneral;
	}

	public String getTituloAcceso() {
		return tituloAcceso;
	}

	public void setTituloAcceso(String tituloAcceso) {
		this.tituloAcceso = tituloAcceso;
	}

	public OpcionPerfilConverter getConverter() {
		return converter;
	}

	public void setConverter(OpcionPerfilConverter converter) {
		this.converter = converter;
	}

	public List<Iconossistemas> getListaOpciones() {
		return listaOpciones;
	}

	public void setListaOpciones(List<Iconossistemas> listaOpciones) {
		this.listaOpciones = listaOpciones;
	}

	public List<Iconossistemas> getListaOpcionesSelect() {
		return listaOpcionesSelect;
	}

	public void setListaOpcionesSelect(List<Iconossistemas> listaOpcionesSelect) {
		this.listaOpcionesSelect = listaOpcionesSelect;
	}
	
	public List<Perfilusuario> getListaPerfilusuario() {
		return listaPerfilusuario;
	}
	
	public void setListaPerfilusuario(List<Perfilusuario> listaPerfilusuario) {
		this.listaPerfilusuario = listaPerfilusuario;
	}
	
	public Perfilusuario getBean() {
		return bean;
	}
	
	public void setBean(Perfilusuario bean) {
		this.bean = bean;
	}
	
	public int getIndice() {
		return indice;
	}
	
	public void setIndice(int indice) {
		this.indice = indice;
	}
	
	public int getEsNuevo() {
		return esNuevo;
	}
	
	public void setEsNuevo(int esNuevo) {
		this.esNuevo = esNuevo;
	}
	
	public String getTituloMant() {
		return tituloMant;
	}
	
	public void setTituloMant(String tituloMant) {
		this.tituloMant = tituloMant;
	}
	
	public String getValABuscar() {
		return valABuscar;
	}
	
	public void setValABuscar(String valABuscar) {
		this.valABuscar = valABuscar;
	}
		
	public void nuevoRegistro(ActionEvent evt)
	{
		setBean(new Perfilusuario());
		setEsNuevo(1);
		setTituloMant("Nuevo Perfil");
	}
		
	public void editarRegistro(ActionEvent evt)
	{
		setBean(getListaPerfilusuario().get(getIndice()));
		setEsNuevo(0);
		setTituloMant("Editar Perfil");
	}
	
	public String eliminarRegistro()
	{
		String forward = getForwardPadre();
		setBean(getListaPerfilusuario().get(getIndice()));
		
		Perfilusuario beanEliminar = getBean();
		System.out.println("Se elimina: " + beanEliminar.getDescripcion());
		delete(beanEliminar);
		
		mostrarRegistros(null);
		
		return forward;
	}
	
	public void guardarRegistro(ActionEvent evt)
	{
		if(getEsNuevo() == 1)
		{
			Perfilusuario nuevoReg = getBean();
			nuevoReg.setIdperfil(Constantes.ID_BLANCO);
			System.out.println("Creando: " + nuevoReg.getDescripcion());
			save(nuevoReg);
		}
		else
		{
			Perfilusuario regModificado = getBean();
			System.out.println("Modificando: " + regModificado.getDescripcion());
			update(regModificado);
		}
		mostrarRegistros(null);
	}

	
	public void mostrarRegistros(ActionEvent evt)
	{
		setListaPerfilusuario(getList());
	}
	
	public void obtenerOpciones(ActionEvent evt)
	{
		getListaOpcionesTmp().clear();
		getListaAccesosPerfilDel().clear();
		setBean(getListaPerfilusuario().get(getIndice()));
		setTituloAcceso("Accesos para el perfil: " + getBean().getDescripcion());
		
			
		setListaOpcionesTmp((new IconossistemasController()).getList());
		List<Accesoperfil> listaAP= new AccesoperfilController().getOpcionesPerfilH(getBean().getIdperfil());
		setListaAccesosPerfilDel(listaAP);
		
		getListaOpcionesSelect().clear();
		for(Accesoperfil ac : listaAP){
			getListaOpcionesSelect().add(ac.getIconossistemas());
		}
		
		// Filtrando los iconos ya seleccionados
		getListaOpciones().clear();
		for(Iconossistemas iconoS:getListaOpcionesTmp())
		{
			boolean seEncontro = false;
			for(Iconossistemas iconoSel:getListaOpcionesSelect())
			{
				if(iconoS.getIdicono().equals(iconoSel.getIdicono())) 
				{
					seEncontro = true;
					break;
				}
			}
			
			if(!seEncontro)
			{
				getListaOpciones().add(iconoS);
			}
		}
		
		getListaGeneral().clear();
		getListaGeneral().addAll(getListaOpciones());
		getListaGeneral().addAll(getListaOpcionesSelect());
		OpcionPerfilConverter converterX = new OpcionPerfilConverter(getListaGeneral());
		setConverter(converterX);
	}
	
	public void obtenerAcciones(ActionEvent evt)
	{
		getListaAccionesPerfilDel().clear();
		setBeanAcceso(getListaAccesoperfil().get(getIndice()));		
		setTituloAccion("Acciones para el Acceso: " + getBeanAcceso().getIconossistemas().getDescripcion());
		setListaAccionesTmp((new DatosgeneralesController()).getDatosTabla(Constantes.TAB_ACCIONES_PERFIL));
		
		List<AccesoperfilAccion> listaAP= new AccesoperfilAccionController().getAccesoperfilAccionH(getBeanAcceso().getIdacceso());		
		setListaAccionesPerfilDel(listaAP);		
		getListaAccionesSelect().clear();
		
		for(AccesoperfilAccion ac : listaAP){
			Datosgenerales beanDG = (new DatosgeneralesController()).getDato(ac.getIdaccion());
			getListaAccionesSelect().add(beanDG);
		}
		
		// Filtrando los iconos ya seleccionados
		getListaAcciones().clear();
		for(Datosgenerales iconoS:getListaAccionesTmp())
		{
			boolean seEncontro = false;
			for(Datosgenerales iconoSel:getListaAccionesSelect())
			{
				if(iconoS.getIddato().equals(iconoSel.getIddato())) 
				{
					seEncontro = true;
					break;
				}
			}
			
			if(!seEncontro)
			{
				getListaAcciones().add(iconoS);
			}
		}
		
		getListaGeneralAcciones().clear();
		getListaGeneralAcciones().addAll(getListaAcciones());
		getListaGeneralAcciones().addAll(getListaAccionesSelect());
		AccionesPaginaConverter converterX = new AccionesPaginaConverter(getListaGeneralAcciones());
		setConverterAcciones(converterX);
		
	}
	
	public void guardarAccesos(ActionEvent evt)
	{
		AccesoperfilController controllerAccesoPerfil = (AccesoperfilController)gService.getSpringBean(Constantes.CONTROLLER_AACCESO_PERFIL);
		setBean(getListaPerfilusuario().get(getIndice()));
		
		// eliminando los accesos actuales
		for(Accesoperfil aaceso: getListaAccesosPerfilDel())
		{
			controllerAccesoPerfil.delete(aaceso);
		}
		
		// Insertando los accesos
		for(Iconossistemas icono: listaOpcionesSelect)
		{
			Accesoperfil beanAcceso = new Accesoperfil();
			beanAcceso.setIdacceso(Constantes.ID_BLANCO);
			beanAcceso.setIconossistemas(icono);
			beanAcceso.setPerfilusuario(getBean());
			beanAcceso.setFhcrea(new Date());
			beanAcceso.setUsucrea(controllerSystem.getUsuarioActual());
			beanAcceso.setPccrea(controllerSystem.getPcUsuario());
			
			controllerAccesoPerfil.nuevoRegistro(null);
			controllerAccesoPerfil.setBean(beanAcceso);
			controllerAccesoPerfil.guardarRegistro(null);
		}
	}
	
	public void guardarAcciones(ActionEvent evt){
		AccesoperfilAccionController controllerAccesoPerfilAccion = (AccesoperfilAccionController)gService.getSpringBean(Constantes.CONTROLLER_AACCESO_PERFIL_ACCION);
		setBeanAcceso(getListaAccesoperfil().get(getIndice()));

		// eliminando los accesos actuales
		for(AccesoperfilAccion aaceso: getListaAccionesPerfilDel())
		{
			controllerAccesoPerfilAccion.delete(aaceso);
		}
		
		// Insertando los accesos
		for(Datosgenerales icono: listaAccionesSelect)
		{
			AccesoperfilAccion beanAcceso = new AccesoperfilAccion();
			beanAcceso.setIdaccesoperfilAccion(Constantes.ID_BLANCO);
			beanAcceso.setAccesoperfil(getBeanAcceso());
			
			beanAcceso.setIdaccion(icono.getIddato());
			beanAcceso.setFechaCreacion(new Date());
			beanAcceso.setUsuarioCreacion(controllerSystem.getUsuarioActual());			
			
			controllerAccesoPerfilAccion.nuevoRegistro(null);
			controllerAccesoPerfilAccion.setBean(beanAcceso);
			controllerAccesoPerfilAccion.guardarRegistro(null);
		}
	}
	
	
	public void mostrarOpcionPerfil(ActionEvent evt)
	{
		setBean(getListaPerfilusuario().get(getIndice()));
		setListaOpcionPerfil((new UvListarOpcionPerfilController()).getLikeDatos(getBean().getIdperfil()));
	}	
	
}
